home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 15 / BBS in a box XV-1.iso / Files / Tele / Telefinder / GroupEditionAppleEvents3.0.sit / Group Edition AE's / THINK C Interfaces / User Manager AE / UMEvents.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-18  |  19.8 KB  |  772 lines  |  [TEXT/KAHL]

  1. /****************************************************************
  2.  *
  3.  *  UMEvents.c
  4.  *
  5.  *  © 1992, Spider Island Software
  6.  *  Written by Chris Silverberg
  7.  *
  8.  *  This file contains the code used to send AppleEvents to
  9.  *  UserManager.  Each routine requires a TargetID to be
  10.  *  passed in.  This ID can be obtained from the PPCBrowser
  11.  *  function.
  12.  *
  13.  **********************************************/
  14.  
  15. #include <UMEvents.h>
  16.  
  17.  
  18. /**********************************
  19.  *
  20.  *  SendStartUM
  21.  *
  22.  *  This routine sends a 'Start User Manager' event to
  23.  *  User Manager.  UM should open it's default user file
  24.  *  (usually 'TeleUsers') and prepare to respond to
  25.  *  Events.
  26.  *
  27.  ***************************/
  28.  
  29. void ShowInt( Byte*, int );
  30. void ShowLong( Byte*, long );
  31.  
  32. short SendStartUM( TargetID *tid, Byte *sessPassword, FSSpec *groupsFolder, FSSpec *userFile )
  33. {
  34.     AppleEvent        evt, reply;
  35.     AEAddressDesc    adsc = { 0,0 };
  36.     short            err, aeErr, myErr;
  37.     long            type, size;
  38.     
  39.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  40.  
  41.     if ( !err )
  42.     {    err = AECreateAppleEvent ( umClass , umStartUM, &adsc, kAutoGenerateReturnID, kAnyTransactionID, &evt );
  43.     
  44.         if ( !err )
  45.         {    err = AEPutParamPtr ( &evt, umPassword, typeChar, (void *) ( &sessPassword[1] ),
  46.                     (long) sessPassword[0] );
  47.         
  48.             if ( !err )
  49.             {    err = AESend ( &evt , &reply , kAEWaitReply | kAENeverInteract | kAEWantReceipt,
  50.                     kAENormalPriority, 60*60*5 , NULL , NULL );
  51.         
  52.                 if ( !err )
  53.                 {
  54.                     err = AEGetParamPtr( &reply, keyErrorNumber, typeSMInt, (void *) &type,
  55.                         (void *) &aeErr, sizeof( short ), (void *) &size );
  56.                         
  57.                     if ( err == errAEDescNotFound )
  58.                     {
  59.                         err = noErr;
  60.                         aeErr = noErr;
  61.                     }
  62.  
  63.                     if ( !err && !aeErr )
  64.                     {    err = AEGetParamPtr( &reply, umUserFileSpec, typeFSS, (void *) &type,
  65.                             (void *) userFile, sizeof( FSSpec ), (void *) &size );
  66.                         //ShowInt("\puser file err ", err );
  67.                         //ShowLong( userFile->name, userFile->parID );
  68.                     
  69.                     }
  70.                     if ( !err && !aeErr )
  71.                     {    err = AEGetParamPtr( &reply, umAGFolderSpec, typeFSS, (void *) &type,
  72.                             (void *) groupsFolder , sizeof( FSSpec ), (void *) &size );
  73.                         //ShowInt("\p groupsFolder file err ", err );
  74.                         //ShowLong(groupsFolder->name, groupsFolder->parID );
  75.                     
  76.                     }
  77.                     myErr = AEDisposeDesc( &reply );
  78.                 }
  79.             }
  80.             
  81.             myErr = AEDisposeDesc( &evt );
  82.         }
  83.         
  84.         myErr = AEDisposeDesc( &adsc );
  85.     }
  86.     
  87.     if ( !err )
  88.         return( aeErr );
  89.     else
  90.         return( err );
  91. }
  92.  
  93.  
  94. /**********************************
  95.  *
  96.  *  SendAddUser
  97.  *
  98.  *  This routine sends an 'Add User' event to
  99.  *  User Manager.  Passed in is a target ID
  100.  *  and a UserRecord which should contain all the
  101.  *  fields for the user.
  102.  *
  103.  ***************************/
  104.  
  105. short SendAddUser( TargetID *tid, Byte *sessPassword, UserRecord *theUser )
  106. {
  107.     AppleEvent        evt, reply;
  108.     AEAddressDesc    adsc = { 0,0 };
  109.     Handle            h;
  110.     short            err, aeErr = noErr, myErr;
  111.     long            type, size;
  112.     UserRecord        userData;
  113.     
  114.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  115.  
  116.     if ( !err )
  117.     {    err = AECreateAppleEvent ( umClass, umAddUser, &adsc, kAutoGenerateReturnID,
  118.             kAnyTransactionID, &evt ) ;
  119.  
  120.         if ( !err )
  121.         {    err = AEPutParamPtr ( &evt, umPassword, typeChar, (void *) ( &sessPassword[1] ),
  122.                 (long) sessPassword[0] );
  123.         
  124.             if ( !err )
  125.                 err = AEPutParamPtr ( &evt, umUserRecord, typeWildCard, (void *) theUser,
  126.                     sizeof( UserRecord ) );
  127.         
  128.             if ( ! err )
  129.                 err = AESend ( &evt , &reply , kAEWaitReply | kAENeverInteract | kAEWantReceipt,
  130.                     kAENormalPriority, kAEDefaultTimeout , NULL , NULL );
  131.         
  132.             if ( !err )
  133.             {
  134.                 err = AEGetParamPtr( &reply, keyErrorNumber, typeSMInt, (void *) &type,
  135.                     (void *) &aeErr, sizeof( short ), (void *) &size );
  136.                 if ( err == errAEDescNotFound )
  137.                 {
  138.                     err = noErr;
  139.                     aeErr = noErr;
  140.                 }
  141.                 
  142.                 myErr = AEDisposeDesc( &reply );
  143.             }
  144.             
  145.             myErr = AEDisposeDesc( &evt );
  146.         }
  147.         myErr = AEDisposeDesc( &adsc );
  148.     }
  149.     if ( !err )
  150.         return( aeErr );
  151.     else
  152.         return( err );
  153. }
  154.  
  155.  
  156. /**********************************
  157.  *
  158.  *  SendChangeUser
  159.  *
  160.  *  This routine sends a 'Change User' event to
  161.  *  User Manager.  Passed in is a target ID, a username,
  162.  *  and the new user record to be replaced.  The name may
  163.  *  be changed if the username in the UserRecord is different
  164.  *  than the passed in username.
  165.  *
  166.  ***************************/
  167.  
  168. short SendChangeUser( TargetID *tid, Byte *sessPassword, Byte *userName, UserRecord *theUser )
  169. {
  170.     AppleEvent        evt, reply;
  171.     AEAddressDesc    adsc = { 0,0 };
  172.     Handle            h;
  173.     short            err, aeErr = noErr, myErr;
  174.     long            type, size;
  175.     UserRecord        userData;
  176.     
  177.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  178.     if ( !err )
  179.     {    err = AECreateAppleEvent ( umClass, umChangeUser, &adsc, kAutoGenerateReturnID,
  180.             kAnyTransactionID, &evt ) ;
  181.     
  182.         if ( !err )
  183.         {    err = AEPutParamPtr ( &evt, umPassword, typeChar, (void *) &sessPassword[1], (long) sessPassword[0] );
  184.         
  185.             if ( !err )
  186.                 err = AEPutParamPtr ( &evt, umUserName, typeChar, (void *) &userName[1], (long)userName[0] );
  187.         
  188.             if ( !err )
  189.                 err = AEPutParamPtr ( &evt, umUserRecord, typeWildCard, (void *) theUser, (long)sizeof( UserRecord ) );
  190.         
  191.             if ( ! err )
  192.                 err = AESend ( &evt , &reply , kAEWaitReply | kAENeverInteract | kAEWantReceipt,
  193.                     kAENormalPriority, kAEDefaultTimeout , NULL , NULL );
  194.         
  195.             if ( !err )
  196.             {
  197.                 err = AEGetParamPtr( &reply, keyErrorNumber, typeSMInt, (void *) &type,
  198.                     (void *) &aeErr, sizeof( short ), (void *) &size );
  199.                 if ( err == errAEDescNotFound )
  200.                 {
  201.                     err = noErr;
  202.                     aeErr = noErr;
  203.                 }
  204.                 
  205.                 myErr = AEDisposeDesc( &reply );
  206.             }
  207.             
  208.             myErr = AEDisposeDesc( &evt );
  209.         }
  210.         
  211.         myErr = AEDisposeDesc( &adsc );
  212.     }
  213.     
  214.     if ( !err )
  215.         return( aeErr );
  216.     else
  217.         return( err );
  218. }
  219.  
  220.  
  221. /**********************************
  222.  *
  223.  *  SendGetUser
  224.  *
  225.  *  This routine sends a 'Get User' event to
  226.  *  User Manager.  Passed in is a target ID,
  227.  *  a username, and a UserRecord.  If the user
  228.  *  is found, the record will be passed back.
  229.  *
  230.  ***************************/
  231.  
  232. short SendGetUser( TargetID *tid, Byte *sessPassword, Byte *theUserName, UserRecord *theUser )
  233. {
  234.     AppleEvent        evt, reply;
  235.     AEAddressDesc    adsc = { 0,0 };
  236.     Handle            h;
  237.     short            err, aeErr = noErr, myErr;
  238.     long            type, size;
  239.  
  240.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  241.  
  242.     if ( !err )
  243.     {    err = AECreateAppleEvent ( umClass, umGetUser, &adsc, kAutoGenerateReturnID,
  244.             kAnyTransactionID, &evt ) ;
  245.     
  246.         if ( !err )
  247.         {    err = AEPutParamPtr ( &evt, umPassword, typeChar, (void *) &sessPassword[1],
  248.                 (long)sessPassword[0] );
  249.         
  250.             if ( !err )
  251.                 err = AEPutParamPtr ( &evt, umUserName, typeChar, (void *) &theUserName[1], (long) theUserName[0] );
  252.         
  253.             if ( ! err )
  254.                 err = AESend ( &evt , &reply , kAEWaitReply | kAENeverInteract | kAEWantReceipt,
  255.                     kAENormalPriority, kAEDefaultTimeout , NULL , NULL ) ;
  256.         
  257.             if ( !err )
  258.             {
  259.                 err = AEGetParamPtr( &reply, keyErrorNumber, typeSMInt, (void *) &type, 
  260.                         (void *) &aeErr, sizeof( short ), (void *) &size );
  261.                 if ( err == errAEDescNotFound )
  262.                 {
  263.                     err = noErr;
  264.                     aeErr = noErr;
  265.                 }
  266.         
  267.                 if ( !err && !aeErr )
  268.                     err = AEGetParamPtr( &reply, umUserRecord, typeWildCard, (void *) &type,
  269.                         (void *) theUser, (long)sizeof( UserRecord ), (void *) &size );
  270.                 
  271.                 myErr = AEDisposeDesc( &reply );
  272.             }
  273.             myErr = AEDisposeDesc( &evt );
  274.         }    
  275.         myErr = AEDisposeDesc( &adsc );
  276.     }
  277.     if ( !err )
  278.         return( aeErr );
  279.     else
  280.         return( err );
  281. }
  282.  
  283.  
  284. /**********************************
  285.  *
  286.  *  SendDeleteUser
  287.  *
  288.  *  This routine sends a 'Delete User' event to
  289.  *  User Manager.  Passed in is a target ID
  290.  *  and a username.
  291.  *
  292.  ***************************/
  293.  
  294. short SendDeleteUser( TargetID *tid, Byte *sessPassword, Byte *theUserName )
  295. {
  296.     AppleEvent        evt, reply;
  297.     AEAddressDesc    adsc = { 0,0 };
  298.     Handle            h;
  299.     short            err, aeErr = noErr, myErr;
  300.     long            type, size;
  301.     UserRecord        userData;
  302.     
  303.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  304.  
  305.     if ( !err )
  306.     {    err = AECreateAppleEvent ( umClass, umDeleteUser, &adsc, kAutoGenerateReturnID,
  307.             kAnyTransactionID, &evt ) ;
  308.  
  309.         if ( !err )
  310.         {    err = AEPutParamPtr ( &evt, umPassword, typeChar, (void *) &sessPassword[1],
  311.                 (long) sessPassword[0] );
  312.         
  313.             if ( !err )
  314.                 err = AEPutParamPtr ( &evt, umUserName, typeChar, (void *) &theUserName[1],
  315.                     (long)theUserName[0] );
  316.         
  317.             if ( !err )
  318.                 err = AESend ( &evt , &reply , kAEWaitReply | kAENeverInteract | kAEWantReceipt,
  319.                     kAENormalPriority, kAEDefaultTimeout , NULL , NULL );
  320.         
  321.             if ( !err )
  322.             {
  323.                 err = AEGetParamPtr( &reply, keyErrorNumber, typeSMInt, (void *) &type,
  324.                     (void *) &aeErr, sizeof( short ), (void *) &size );
  325.                 if ( err == errAEDescNotFound )
  326.                 {
  327.                     err = noErr;
  328.                     aeErr = noErr;
  329.                 }
  330.                 
  331.                 myErr = AEDisposeDesc( &reply );
  332.             }
  333.             
  334.             myErr = AEDisposeDesc( &evt );
  335.         }
  336.         myErr = AEDisposeDesc( &adsc );
  337.     }
  338.     if ( !err )
  339.         return( aeErr );
  340.     else
  341.         return( err );
  342. }
  343.  
  344.  
  345. /**********************************
  346.  *
  347.  *  SendCreateUser
  348.  *
  349.  *  This routine sends a 'Create User' event to
  350.  *  User Manager.  Passed in is a target ID,
  351.  *  a username, password, and phone number in strings.
  352.  *  User Manager will create a new user based on this
  353.  *  information and the default values.
  354.  *
  355.  ***************************/
  356.  
  357. short SendCreateUser( TargetID *tid, Byte *sessPassword, Byte *userName, Byte *userPassword,
  358.     Byte *userPhone )
  359. {
  360.     AppleEvent        evt, reply;
  361.     AEAddressDesc    adsc = { 0,0 };
  362.     Handle            h;
  363.     short            err, aeErr = noErr, myErr;
  364.     long            type, size;
  365.     UserRecord        userData;
  366.     
  367.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  368.  
  369.     if ( !err )
  370.     {    err = AECreateAppleEvent ( umClass, umCreateUser, &adsc, kAutoGenerateReturnID,
  371.             kAnyTransactionID, &evt ) ;
  372.     
  373.         if ( !err )
  374.         {    err = AEPutParamPtr ( &evt, umPassword, typeChar, (void *) &sessPassword[1],
  375.                 (long) sessPassword[0] );
  376.         
  377.             if ( !err )
  378.                 err = AEPutParamPtr ( &evt, umUserName, typeChar, (void *) &userName[1],
  379.                     (long)userName[0] );
  380.         
  381.             if ( !err )
  382.                 err = AEPutParamPtr ( &evt, umUserPassword, typeChar, (void *) &userPassword[1],
  383.                     (long)userPassword[0] );
  384.         
  385.             if ( !err )
  386.                 err = AEPutParamPtr ( &evt, umUserPhone, typeChar, (void *) &userPhone[1],
  387.                     (long)userPhone[0] );
  388.         
  389.             if ( ! err )
  390.                 err = AESend ( &evt , &reply , kAEWaitReply | kAENeverInteract | kAEWantReceipt,
  391.                     kAENormalPriority, kAEDefaultTimeout , NULL , NULL );
  392.         
  393.             if ( !err )
  394.             {
  395.                 err = AEGetParamPtr( &reply, keyErrorNumber, typeSMInt, (void *) &type,
  396.                     (void *) &aeErr, (long)sizeof( short ), (void *) &size );
  397.                 if ( err == errAEDescNotFound )
  398.                 {
  399.                     err = noErr;
  400.                     aeErr = noErr;
  401.                 }
  402.                 
  403.                 myErr = AEDisposeDesc( &reply );
  404.             }
  405.             
  406.             myErr = AEDisposeDesc( &evt );
  407.         }
  408.         
  409.         myErr = AEDisposeDesc( &adsc );
  410.     }
  411.     
  412.     if ( !err )
  413.         return( aeErr );
  414.     else
  415.         return( err );
  416. }
  417.  
  418.  
  419. /**********************************
  420.  *
  421.  *  SendUpdateUser
  422.  *
  423.  *  This routine sends an update user event
  424.  *  to a program.  Passed is the session password,
  425.  *  username, and a userrecord that has various
  426.  *  delta values.  The files that should be
  427.  *  valid in this user record are:
  428.  *
  429.  *    GEH uses this when a user logs off to update stats        
  430.  *
  431.  *        totalTime            delta seconds online
  432.  *        kb_uploaded            delta kilobytes uploaded
  433.  *        kb_downloaded        delta kilobytes downloaded
  434.  *        email_sent            delta num email messages sent
  435.  *        msgs_posted            delta num topic msgs posted
  436.  *
  437.  *        lastUpdate            startof this logon ( mac time in secs )
  438.  *
  439.  *        User Manager will also change these fields
  440.  *
  441.  *        LogonsMax     is incremented by the num of minutes in delta total time
  442.  *        MaxTime     is decremented by the elapsed minutes if the user has an "absolute" 
  443.  *                    logon limit
  444.  *        LastDay        changes to lastUpdate if a day has elapsed
  445.  *
  446.  *        totalCalls    +1
  447.  *        LogonsToday    +1
  448.  *
  449.  ***********************************************/
  450.  
  451. short SendUpdateUser( TargetID *tid, Byte *sessPassword, Byte *userName, UserRecord *theUser )
  452. {
  453.     AppleEvent        evt, reply;
  454.     AEAddressDesc    adsc = { 0,0 };
  455.     Handle            h;
  456.     short            err, aeErr = noErr;
  457.     long            type, size;
  458.     UserRecord        userData;
  459.     
  460.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  461.     if ( !err )
  462.     {
  463.         err = AECreateAppleEvent ( umClass, umUpdateUser, &adsc, kAutoGenerateReturnID,
  464.             kAnyTransactionID, &evt ) ;
  465.  
  466.         if ( !err )
  467.         {
  468.             err = AEPutParamPtr ( &evt, umPassword, typeChar, (void *) ( &sessPassword[1] ),
  469.                 (long) sessPassword[0] );
  470.     
  471.             if ( !err )
  472.                 err = AEPutParamPtr ( &evt, umUserName, typeChar, (void *) &userName[1],
  473.                     (long)userName[0] );
  474.         
  475.             if ( !err )
  476.                 err = AEPutParamPtr ( &evt, umUserRecord, typeWildCard, (void *) theUser,
  477.                     (long)sizeof( UserRecord ) );
  478.         
  479.             if ( ! err )
  480.                 err = AESend ( &evt , &reply , kAEWaitReply | kAENeverInteract | kAEWantReceipt,
  481.                     kAENormalPriority, kAEDefaultTimeout , NULL , NULL );
  482.         
  483.             if ( !err )
  484.             {
  485.                 err = AEGetParamPtr( &reply, keyErrorNumber, typeSMInt, (void *) &type,
  486.                     (void *) &aeErr, (long)sizeof( short ), (void *) &size );
  487.                 if ( err == errAEDescNotFound )
  488.                 {
  489.                     err = noErr;
  490.                     aeErr = noErr;
  491.                 }
  492.                 
  493.                 err = AEDisposeDesc( &reply );
  494.             }
  495.             err = AEDisposeDesc( &evt );
  496.         }
  497.         err = AEDisposeDesc( &adsc );
  498.     }
  499.  
  500.     if ( !err )
  501.         return( aeErr );
  502.     else
  503.         return( err );
  504. }
  505.  
  506.  
  507. /***************************************
  508.  *
  509.  *  SendChangePassword
  510.  *
  511.  *  This routine sends a change password
  512.  *  event to a program.  Passed in are the
  513.  *  session password, the user name (pascal string),
  514.  *  and the new password.
  515.  *
  516.  *******************************/
  517.  
  518. short SendChangePassword( TargetID *tid, Byte *sessPassword, Byte *userName, Byte *password )
  519. {
  520.     AppleEvent        evt, reply;
  521.     AEAddressDesc    adsc = { 0,0 };
  522.     Handle            h;
  523.     short            err, aeErr = noErr;
  524.     long            type, size;
  525.     UserRecord        userData;
  526.     
  527.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  528.  
  529.     if ( !err )
  530.     {
  531.         err = AECreateAppleEvent ( umClass, umChangePassword, &adsc, kAutoGenerateReturnID,
  532.             kAnyTransactionID, &evt ) ;
  533.  
  534.         if ( !err )
  535.         {
  536.             err = AEPutParamPtr ( &evt, umPassword, typeChar, (void *) &sessPassword[1],
  537.                 (long) sessPassword[0] );
  538.     
  539.             if ( !err )
  540.                 err = AEPutParamPtr ( &evt, umUserName, typeChar, (void *) &userName[1],
  541.                     userName[0] );
  542.         
  543.             if ( !err )
  544.                 err = AEPutParamPtr ( &evt, umUserPassword, typeChar, (void *) &password[1],
  545.                     (long) password[0] );
  546.         
  547.             if ( !err )
  548.                 err = AESend ( &evt , &reply , kAEWaitReply | kAENeverInteract | kAEWantReceipt,
  549.                     kAENormalPriority, kAEDefaultTimeout , NULL , NULL );
  550.         
  551.             if ( !err )
  552.             {
  553.                 err = AEGetParamPtr( &reply, keyErrorNumber, typeSMInt, (void *) &type,
  554.                     (void *) &aeErr, (long)sizeof( short ), (void *) &size );
  555.                 if ( err == errAEDescNotFound )
  556.                 {
  557.                     err = noErr;
  558.                     aeErr = noErr;
  559.                 }
  560.                 
  561.                 err = AEDisposeDesc( &reply );
  562.             }
  563.             err = AEDisposeDesc( &evt );
  564.         }
  565.         err = AEDisposeDesc( &adsc );
  566.     }
  567.  
  568.     if ( !err )
  569.         return( aeErr );
  570.     else
  571.         return( err );
  572. }
  573.  
  574.  
  575. /**********************************
  576.  *
  577.  *  SendScanUsers
  578.  *
  579.  *  This routine allows the client to easily scan
  580.  *  the user file that the server is using.  The variables:
  581.  *
  582.  *        tid                target ID of server
  583.  *        password        session password
  584.  *        lastUser        the last user that was scanned.  empty string
  585.  *                            if this is the first access in a scan.
  586.  *        currentUser        the space where the new user's name will be stored.
  587.  *        goForward        if this is true, the search will be a forward search.
  588.  *                            otherwise it will be backwards.
  589.  *        doLoadUser        if this is true, the user will be fetched from the
  590.  *                            file.  Otherwise, just the name will be accesses
  591.  *                            from the index file.
  592.  *        theUser            where the user record will be stored if doLoadUser is true.
  593.  *
  594.  ***************************/
  595.  
  596. short SendScanUsers( TargetID *tid, Byte *sessPassword, Byte *lastUser, Byte *currentUser,
  597.     short goForward, short doLoadUser, UserRecord *theUser )
  598. {
  599.     AppleEvent        evt, reply;
  600.     AEAddressDesc    adsc = { 0,0 };
  601.     Handle            h;
  602.     short            err, aeErr = noErr;
  603.     long            type, size;
  604.  
  605.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  606.  
  607.     if ( !err )
  608.     {
  609.         err = AECreateAppleEvent ( umClass, umScanUsers, &adsc, kAutoGenerateReturnID,
  610.             kAnyTransactionID, &evt ) ;
  611.  
  612.         if ( !err )
  613.         {
  614.             err = AEPutParamPtr ( &evt, umPassword, typeChar, (void *) &sessPassword[1],
  615.                 (long)sessPassword[0] );
  616.     
  617.             if ( !err )
  618.                 err = AEPutParamPtr ( &evt, umLastUser, typeChar, (void *) &lastUser[1],
  619.                     (long)lastUser[0] );
  620.         
  621.             if ( !err )
  622.                 err = AEPutParamPtr ( &evt, umGoForward, typeSMInt, (void *) &goForward,
  623.                     (long)sizeof( short ) );
  624.         
  625.             if ( !err )
  626.                 err = AEPutParamPtr ( &evt, umDoLoadUser, typeSMInt, (void *) &doLoadUser,
  627.                     (long)sizeof( short ) );
  628.         
  629.             if ( ! err )
  630.                 err = AESend ( &evt , &reply , kAEWaitReply | kAENeverInteract | kAEWantReceipt,
  631.                     kAENormalPriority, kAEDefaultTimeout , NULL , NULL ) ;
  632.         
  633.             if ( !err )
  634.             {
  635.                 err = AEGetParamPtr( &reply, keyErrorNumber, typeSMInt, (void *) &type,
  636.                     (void *) &aeErr, (long)sizeof( short ), (void *) &size );
  637.                 if ( err == errAEDescNotFound )
  638.                 {
  639.                     err = noErr;
  640.                     aeErr = noErr;
  641.                 }
  642.         
  643.                 if ( !err && !aeErr )
  644.                     err = AEGetParamPtr( &reply, umUserName, typeChar, (void *) &type,
  645.                         (void *) ¤tUser[1], (long)U_NAME_MAX, (void *) &size );
  646.                 if ( !err )
  647.                 {    if ( size > U_NAME_MAX - 1 )
  648.                         size = U_NAME_MAX - 1;
  649.                     currentUser[0] = (Byte)size;
  650.                 }
  651.                 else
  652.                     currentUser[0] = 0;
  653.                 
  654.                 if ( !err && !aeErr )
  655.                     err = AEGetParamPtr( &reply, umUserRecord, typeWildCard, (void *) &type,
  656.                         (void *) theUser, (long)sizeof( UserRecord ), (void *) &size );
  657.                         
  658.                 err = AEDisposeDesc( &reply );
  659.             }
  660.             err = AEDisposeDesc( &evt );
  661.         }
  662.                 
  663.         err = AEDisposeDesc( &adsc );
  664.     }
  665.  
  666.     if ( !err )
  667.         return( aeErr );
  668.     else
  669.         return( err );
  670. }
  671.  
  672.  
  673. /************************************
  674.  *
  675.  *  SendGetMailPath
  676.  *
  677.  *  This routine will pass back the mailpath for a user.
  678.  *  Since this is a public routine, no password is necessary.
  679.  *
  680.  *****************************/
  681.  
  682. short SendGetMailPath( TargetID *tid, Byte *userName, FSSpec *mailFSSpec )
  683. {
  684.     AppleEvent        evt, reply;
  685.     AEAddressDesc    adsc = { 0,0 };
  686.     Handle            h;
  687.     short            err, aeErr = noErr, myErr;
  688.     long            type, size;
  689.  
  690.  
  691.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  692.  
  693.     if ( !err )
  694.     {    err = AECreateAppleEvent ( umClass, umGetMailPath, &adsc, kAutoGenerateReturnID, kAnyTransactionID, &evt );
  695.     
  696.         if ( !err )
  697.         {    err = AEPutParamPtr ( &evt, umUserName, typeChar, (void *) &userName[1], (long)userName[0] );
  698.         
  699.             if ( ! err )
  700.                 err = AESend ( &evt , &reply , kAEWaitReply | kAENeverInteract | kAEWantReceipt,
  701.                     kAENormalPriority, kAEDefaultTimeout , NULL , NULL ) ;
  702.         
  703.             if ( !err )
  704.             {
  705.                 err = AEGetParamPtr( &reply, keyErrorNumber, typeSMInt, (void *) &type,
  706.                     (void *) &aeErr, (Size)sizeof( short ), (void *) &size );
  707.                     
  708.                 if ( err == errAEDescNotFound )
  709.                 {
  710.                     err = noErr;
  711.                     aeErr = noErr;
  712.                 }
  713.         
  714.                 if ( !err && !aeErr )
  715.                     err = AEGetParamPtr( &reply, umMailPath, typeFSS, (void *) &type,
  716.                         (void *) mailFSSpec, (Size)sizeof(FSSpec) , (void *) &size );
  717.                 
  718.                 myErr = AEDisposeDesc( &reply );
  719.             }
  720.             myErr = AEDisposeDesc( &evt );
  721.         }    
  722.         myErr = AEDisposeDesc( &adsc );
  723.     }
  724.     
  725.     if ( !err )
  726.         return( aeErr );
  727.     else
  728.         return( err );
  729. }
  730.  
  731.  
  732. /**********************************
  733.  *
  734.  *  SendQuitApp
  735.  *
  736.  *  This routine sends a 'Quit User' event to a
  737.  *  program.  Passed in is the target ID.
  738.  *
  739.  ***************************/
  740.  
  741. short SendQuitApp( TargetID *tid )
  742. {
  743.     AppleEvent        evt, reply;
  744.     AEAddressDesc    adsc = { 0,0 };
  745.     short            err, myErr;
  746.     
  747.     err = AECreateDesc ( typeTargetID, (void *) tid, sizeof( TargetID ), &adsc ) ;
  748.  
  749.     if ( !err )
  750.     {    err = AECreateAppleEvent ( kCoreEventClass , kAEQuitApplication, &adsc, kAutoGenerateReturnID,
  751.             kAnyTransactionID, &evt ) ;
  752.  
  753.         if ( !err )
  754.         {    err = AESend ( &evt , &reply , kAENoReply | kAENeverInteract | kAEWantReceipt,
  755.                 kAENormalPriority, kAEDefaultTimeout , NULL , NULL );
  756.             
  757.             if ( !err )
  758.                 myErr = AEDisposeDesc( &reply );
  759.                 
  760.             myErr = AEDisposeDesc( &evt );
  761.         }
  762.         
  763.         myErr = AEDisposeDesc( &adsc );
  764.     }
  765.     
  766.     if ( !err )
  767.         return( noErr );
  768.     else
  769.         return( err );
  770. }
  771.  
  772.